package com.cskaoyan.wordmemorize.auth;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// todo 定义我们自己的@SaAdminCheckPermission注解 定义admin请求方法的拦截器的拦截逻辑
// todo SaAdminCheckPermission 隐式继承了 @SaCheckPermission 的所有属性，并固定了 type = "admin"
@SaCheckPermission(type = "admin")
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaAdminCheckPermission {

    /**
     * 需要校验的权限码
     * @return 需要校验的权限码
     */
    // todo @AliasFor 声明 @SaAdminCheckPermission的value 为 @SaCheckPermission的value的别名
    // todo 定义需要校验的权限码(@SaCheckPermission的value) 例: @SaAdminCheckPermission("user:delete")需要 user:delete 权限
    // todo 通过@AliasFor和 @SaCheckPermission注解实现了: @SaAdminCheckPermission("user:delete") 等价于  @SaCheckPermission(value="user:delete",type="admin")
    @AliasFor(annotation = SaCheckPermission.class)
    String [] value() default {};

    /**
     * 验证模式：AND | OR，默认AND
     * @return 验证模式
     */
    // todo 定义权限校验的逻辑模式, 例: @SaAdminCheckPermission(value = {"user:read", "user:write"}, mode = SaMode.OR)
    // todo 表示用户有 user:read 或 user:write 任意一个权限即可通过校验。
    @AliasFor(annotation = SaCheckPermission.class)
    SaMode mode() default SaMode.AND;

    /**
     * 在权限校验不通过时的次要选择，两者只要其一校验成功即可通过校验
     *
     * <p>
     * 	例1：@SaCheckPermission(value="user-add", orRole="admin")，
     * 	代表本次请求只要具有 user-add权限 或 admin角色 其一即可通过校验。
     * </p>
     *
     * <p>
     * 	例2： orRole = {"admin", "manager", "staff"}，具有三个角色其一即可。 <br>
     * 	例3： orRole = {"admin, manager, staff"}，必须三个角色同时具备。
     * </p>
     *
     * @return /
     */
    // todo 定义权限校验失败时的备选角色, 在权限校验不通过时的次要选择，两者只要其一校验成功即可通过校验"
    // todo 例: @SaAdminCheckPermission(value = "user:delete", orRole = "superadmin") 无权限是superadmin角色也可通过
    @AliasFor(annotation = SaCheckPermission.class)
    String[] orRole() default {};
}
